/**
 * author: zhou
 * date: 2017.10.18
 * description: 服务启动文件
 * middlewares: {
 *      koa: 框架启动
 *      koa-bodyparser: 转换收到的请求数据 options: json | form | text
 *      koa-onerror: 处理程序运行中出现的错误 options: all | text | json | html | redirect
 *      koa-cors: 允许跨域 options: origin | methods
 *      koa-json: 格式化返回结果 eg: { "foo": "bar" }
 *      koa-session2: session 管理
 * }
 * 
 */

// 引入koa和中间件
const   koa           = require('koa'),
        koaBodyParser = require('koa-bodyparser'),
        koaOnerror    = require('koa-onerror'),
        koaCors       = require('koa-cors'),
        koaJson       = require('koa-json'),
        session       = require("koa-session2");

// 引入全局配置文件
const   config = require('config-lite')(__dirname), // 环境变量配置
        logger = require('./utils/log');            // 日志配置

// 引入session管理文件
const Store = require('./core/redis/store');

// 引入自定义中间件
const middlewares = require('./utils/middlewares');

// 引入路由
const router = require('./routes/index');

// 启动数据库连接
const mongoConnection = require('./core/mongo/mongo');
const redisConnection = require('./core/redis/redis');

/**
 * 主程序开始
 * 创建服务实例,加载中间件
 */
const app = new koa(); // 创建 app 实例
koaOnerror(app);       // 监听程序运行中产生的错误

// 启用session管理
app.use(session({ store: new Store({ key: "SESSIONID" }) }));

// 开启中间件
app .use(koaCors())            // 允许跨域
    .use(koaBodyParser())      // 解析查询字符串 ctx.request.body = ...
    .use(koaJson());           // 格式化返回结果

logger.initLogPath(); // 初始化日志目录

app.use(middlewares.logger);                           // 启用logger
app.use(middlewares.isRequestBodyComplete);            // 验证请求体
app.use(router.routes()).use(router.allowedMethods()); // 加载路由

// 监听程序中未处理的错误
process.on('uncaughtException', (err) => {
    logger.logError(err, new Date());
});
process.on('unhandledRejection', (err) => {
    logger.logError(err, new Date());
});
process.on('exit', (code) => {
    logger.logError(`About to exit with code: ${code}`, new Date());
});

// 启动服务器
app.listen(config.server.port, (err) => {
    err ? console.log(`students-server start failed, please see Error: ${err}`)
        : console.log(`students-server is running on port ${config.server.port} & Environment: ${config.server.env}`);
});